#include<memory>
#include<functional>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include"ThreadPool.hpp"//上层处理任务、调用处理方法
#include"Route.hpp"//实现功能
#include"ChatServer.hpp"//io


using task_t = std::function<void()>;

void Usage(std::string proc)
{
    std::cout << "Usage: " << proc << " serverport";
}

void chat(int sockfd , std::string message , InetAddr addr)
{
    //此处可以debug
    //打印一下获取到的信息
    LOG(LogLevel::DEBUG) << "sockfd: " << sockfd;
    LOG(LogLevel::DEBUG) << "message: " << message;
    LOG(LogLevel::DEBUG) << "addt: " << addr.ToString();
    //将消息进行返回
    sendto(sockfd , message.c_str() , message.size(), 0 , addr.Addr() , addr.Length()); 
}

int main(int argc ,  char* argv[])
{
    if(argc!=2)
    {
        Usage(argv[0]);
        return 0;
    }

    //指定日志刷新方法
    EnableConsoleLogStrategy();

    uint16_t port = std::stoi(argv[1]);

    //1、消息转发功能
    std::unique_ptr<Route> r = std::make_unique<Route>();

    //2、获取线程池单例
    ThreadPool<task_t>* tp = ThreadPool<task_t>::GetInstance();

    //3、指针指向服务端
    //服务器启动的时候会转而执行回调方法 -> Route 中发送给所有在线用户 -> 处理成任务丢进线程池中
    std::unique_ptr<ChatServer> usvr = std::make_unique<ChatServer>(port , 
        [&r , &tp](int sockfd ,std::string message , InetAddr addr){
            task_t task = std::bind(&Route::RouteMessageToAll , r.get() , sockfd , message , addr);//利用bind 实现不传参
            //绑定成员函数需要使用& , r 是指向Route 对象的智能指针，通过get可以获得指针
            //放进任务队列中
            tp->Enqueue(task);
        });
    usvr->Init();
    usvr->Start();
    return 0;
}